package model;

import java.util.List;
import java.util.ArrayList;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import vos.Articulo;
import vos.Kit;

public class TransaccionesBD {
	public static  java.sql.Connection oConexion ;
	Statement  st = null;
	ConnPostgres conexion = new ConnPostgres();
	
	public void conectar(){		
		try{
			oConexion = conexion.conectarBD();
		}
		catch(Exception e){
			e.printStackTrace();
		}
	}
	
	public void saveArticulo(Articulo articulo){
		try{
			conectar();
			boolean comitida;
			st = oConexion.createStatement();
		    comitida = st.execute("Insert into Articulo values('"+articulo.getID()+"','"+articulo.getNombre()+"','"+articulo.getDescripcion()+"',"+articulo.getPrecio()+")");	      
	        //st.executeQuery("Select nCantidad from Stock where sNombre='"+articulo.getNombre()+"')");	        
		}catch (SQLException e) {
			// TODO: handle exception		
			e.printStackTrace();
		}
	}
	
	public void deleteArticulo(String id){
		//Borrar el articulo de la base de datos por su id, y actualizar stock
	}
	
	
	
	public List<Articulo> findAllArticulo(){
		List<Articulo> arts = new ArrayList<Articulo>();
		
		try{
			conectar();
			ResultSet rsArticulo;
			st = oConexion.createStatement();
			rsArticulo = st.executeQuery("Select + from Producto");
			if(rsArticulo.next()){
				Articulo temp = new Articulo(rsArticulo.getString("id"),rsArticulo.getNString("snombre"),rsArticulo.getNString("sdescripcion"),rsArticulo.getDouble("fprecio"));;
				arts.add(temp);
			}
			 return arts;
		}catch(SQLException e){
			e.printStackTrace();
		}
		return arts; 
	}
	
	public Articulo findArticuloById(String id){
		try{
			conectar();
			ResultSet rsArticulo;
			st = oConexion.createStatement();
			rsArticulo = st.executeQuery("Select * from Producto where id = '" + id + "'");
			//if(rsArticulo.first()){
				Articulo art = new Articulo(id,rsArticulo.getNString("snombre"),rsArticulo.getNString("sdescripcion"),rsArticulo.getDouble("fprecio"));
				//ArticuloComponente kit = new Kit(rsArticulo.getNString("snombre"),rsArticulo.getNString("sdescripcion"),rsArticulo.getNString("stemporada"));
			//}
			return art;
		}catch(SQLException e){
			e.printStackTrace();
		}
		//este return solo lo puse para que no me marcara error el metodo pero debe regresar el articulo que encontro en la b.d.
		return new Articulo("id","nombre","descripcion",0.0);
		
	}
	
	public List<Articulo> findByName(String sNombre){
		List<Articulo> arts = new ArrayList<Articulo>();
		
		try{
			conectar();
			ResultSet rsArticulo;
			st = oConexion.createStatement();
			rsArticulo = st.executeQuery("Select * from Producto where Nombre like %" + sNombre + "%");
			if(rsArticulo.next()){
				Articulo temp = new Articulo(rsArticulo.getString("id"),rsArticulo.getNString("snombre"),rsArticulo.getNString("sdescripcion"),rsArticulo.getDouble("fprecio"));;
				arts.add(temp);
			}
			 return arts;
		}catch(SQLException e){
			e.printStackTrace();
		}
		return arts; 
	}
	
//Busquedas Kits
	 
	public List<Kit> findAllKits(){
		List<Kit> arts = new ArrayList<Kit>();
		
		try{
			conectar();
			ResultSet rsArticulo;
			st = oConexion.createStatement();
			rsArticulo = st.executeQuery("Select * Kit");
			if(rsArticulo.next()){
				Kit temp = new Kit(rsArticulo.getString("idKit"),rsArticulo.getNString("snombre"),rsArticulo.getNString("sdescripcion"));;
				arts.add(temp);
			}
			 return arts;
		}catch(SQLException e){
			e.printStackTrace();
		}
		return arts; 
	}
	
	public Kit findKitById(String id){
		try{
			conectar();
			ResultSet rsArticulo;
			st = oConexion.createStatement();
			rsArticulo = st.executeQuery("Select * from Kit where id = '" + id + "'");
			//if(rsArticulo.first()){
				
				Kit kit = new Kit(rsArticulo.getNString("snombre"),rsArticulo.getNString("sdescripcion"),rsArticulo.getNString("stemporada"));
			//}
			return kit;
		}catch(SQLException e){
			e.printStackTrace();
		}
		//este return solo lo puse para que no me marcara error el metodo pero debe regresar el articulo que encontro en la b.d.
		return new Kit("id","nombre","descripcion");
		
	}
	
	public List<Kit> findByNameKit(String sNombre){
		List<Kit> arts = new ArrayList<Kit>();
		
		try{
			conectar();
			ResultSet rsArticulo;
			st = oConexion.createStatement();
			rsArticulo = st.executeQuery("Select * from Kit where Nombre like %" + sNombre + "%");
			if(rsArticulo.next()){
				Kit temp = new Kit(rsArticulo.getString("id"),rsArticulo.getNString("snombre"),rsArticulo.getNString("sdescripcion"));;
				arts.add(temp);
			}
			 return arts;
		}catch(SQLException e){
			e.printStackTrace();
		}
		return arts; 
	}
	
	
	
	
	public void altaAutoparte(Articulo autoparte){
		
		String id;
		String nombre;
		String descripcion;
		double precio;
		id = autoparte.getID();
	    nombre = autoparte.getNombre();
	    descripcion = autoparte.getDescripcion();
	    precio = autoparte.getPrecio();
	    ResultSet rArticulo1;
		
	    try{
		   conectar();
		   st=oConexion.createStatement();
	       rArticulo1 =st.executeQuery("Insert into Articulo values('"+id+"','"+nombre+"','"+descripcion+"',"+precio+")");
	       conexion.cerrarConexionBD();
		}catch(SQLException e){
			e.printStackTrace();
		}
		
	}
	
	public void actualizaStock(Articulo autoparte){
		conectar();
		int stock;
		String nombre=autoparte.getNombre();
		 ResultSet rArticulo2;
		try{
		 rArticulo2=st.executeQuery("Select nCantidad from Stock where sNombre='"+nombre+"'");
	       stock=rArticulo2.getInt("nCantidad");
	       stock++;//incrementa stock
	       rArticulo2 =st.executeQuery("Update Stock Set nCantidad="+stock+" where Snombre='"+nombre+"'");
	       conexion.cerrarConexionBD();
		}catch(SQLException e){
			e.printStackTrace();
		}
	}
	//Esto se va aocupar cada vez que se haga una venta se debe de dar de disminuir el stock
	//O no se si se vaya a ahcer automaticamente con el metodo borrar 
	public void actualizaStockVenta(Articulo autoparte){
		conectar();
		int stock;
		String nombre=autoparte.getNombre();
		 ResultSet rArticulo2;
		try{
		 rArticulo2=st.executeQuery("Select nCantidad from Stock where sNombre='"+nombre+"'");
	       stock=rArticulo2.getInt("nCantidad");
	       stock--;//incrementa stock
	       rArticulo2 =st.executeQuery("Update Stock Set nCantidad="+stock+" where Snombre='"+nombre+"'");
	       conexion.cerrarConexionBD();
		}catch(SQLException e){
			e.printStackTrace();
		}
	}
	
	//Si el stock se va a aumentar o disminuir automaticamente en la base de datos 
	//deberiamos de ocupar mejor un solo metodo para manejar las cantidades
	//regresa el stock que e slo q voy a manjera para el observer 
	
	public int obtieneStock(Articulo autoparte){
		conectar();
		int stock=0;
		String nombre=autoparte.getNombre();
		 ResultSet rArticulo2;
		try{
		 rArticulo2=st.executeQuery("Select nCantidad from Stock where sNombre='"+nombre+"'");
	       stock=rArticulo2.getInt("nCantidad");
	       conexion.cerrarConexionBD();
		}catch(SQLException e){
			e.printStackTrace();
		}
		
		return stock;
	}
	
	
	public void altaKit(Kit kit){
		String id;
		String nombre;
		String descripcion;
		String temporada;
		id= kit.getID();
	    nombre=kit.getNombre();
	    descripcion=kit.getDescripcion();
	    temporada=kit.getTemporada();
	    conectar();
	    try{
	    ResultSet rArticulo =st.executeQuery("Insert into Kit values('"+id+"','"+nombre+"','"+descripcion+"','"+temporada+"')");
	    }catch(SQLException e){
			e.printStackTrace();
		}
	}
	
	public void kitParte(Kit kit, Articulo articulo){
		
		String idKit,idArticulo;
		String nombreKit,nombreArticulo;
		idKit = kit.getID();
		idArticulo = articulo.getID();
	    nombreKit = kit.getNombre();
	    nombreArticulo = articulo.getNombre();
	    
	    conectar();
	    
	    try{
		 ResultSet rArticulo2 =st.executeQuery("Insert into ComponentesKit values('"+idKit+"','"+idArticulo+"')");
	    }catch(SQLException e){
			e.printStackTrace();
		}
	}

	
}
